package com.example.network.XML_Parsing;

import android.content.Context;
import android.util.Xml;

import com.example.network.entity.Person;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
import org.xmlpull.v1.XmlSerializer;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

public class PullHelper {


    public static ArrayList<Person> getPersons(Context context,String path)throws Exception
    {
        //获取文件资源建立输入流对象
        InputStream xml = context.getAssets().open(path);
        ArrayList<Person> persons = null;
        Person person = null;
        // 创建一个xml解析的工厂
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        // 获得xml解析类的引用
        XmlPullParser parser = factory.newPullParser();
        //直接获得xml解析类的引用
        //XmlPullParser paser = Xml.newPullParser();

        //为parser解析器对象提供xml流与编码格式
        parser.setInput(xml, "UTF-8");
        // 获得事件的类型
        int eventType = parser.getEventType();
        //判断是否是结束返回
        while (eventType != XmlPullParser.END_DOCUMENT) {
            //用switch对不同的事件类型进行处理
            switch (eventType) {
                //判断是否读取到xml的声明
                case XmlPullParser.START_DOCUMENT:
                    persons = new ArrayList<Person>();
                    break;
                //开始标签返回
                case XmlPullParser.START_TAG:
                    if ("person".equals(parser.getName())) {
                        person = new Person();
                        // 取出属性值
                        int id = Integer.parseInt(parser.getAttributeValue(0));
                        person.setId(id);
                    } else if ("name".equals(parser.getName())) {
                        String name = parser.nextText();// 获取该节点的内容
                        person.setName(name);
                    } else if ("age".equals(parser.getName())) {
                        int age = Integer.parseInt(parser.nextText());
                        person.setAge(age);
                    }
                    break;
                //结束标签返回
                case XmlPullParser.END_TAG:
                    if ("person".equals(parser.getName())) {
                        persons.add(person);
                        person = null;
                    }
                    break;
            }
            //循环解析下一个元素
            eventType = parser.next();
        }
        return persons;
    }


    public static void save(List<Person> persons, OutputStream out) throws Exception {
        //创建XmlSerializer(xml序列化类)的实例
        XmlSerializer serializer = Xml.newSerializer();
        //为XmlSerializer设置输出流与编码格式
        serializer.setOutput(out, "UTF-8");
        //为XmlSerializer设置xml的编码格式
        serializer.startDocument("UTF-8", true);
        //设置根元素
        serializer.startTag(null, "persons");
        //遍历子元素
        for (Person p : persons) {
            //设置根元素
            serializer.startTag(null, "person");
            //设置属性
            serializer.attribute(null, "id", p.getId() + "");
            //设置根元素
            serializer.startTag(null, "name");
            //设置值
            serializer.text(p.getName());
            //设置完结元素
            serializer.endTag(null, "name");
            //设置根元素
            serializer.startTag(null, "age");
            //设置值
            serializer.text(p.getAge() + "");
            //设置完结元素
            serializer.endTag(null, "age");
            //设置完结元素
            serializer.endTag(null, "person");
        }
        //设置完结元素
        serializer.endTag(null, "persons");
        //结束文档编写
        serializer.endDocument();
        //关闭输出流
        out.flush();
        out.close();
    }
}
